package ar.drools.apuestas.modelo;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Transient;

import ar.drools.apuestas.enums.CapacidadGanadora;
import ar.drools.apuestas.enums.Clasificador;
import ar.drools.apuestas.enums.EstadoAnimico;
import ar.drools.apuestas.enums.PromedioAbandonos;
import ar.drools.apuestas.enums.PromedioBox;
import ar.drools.apuestas.enums.PromedioGanador;
import ar.drools.apuestas.enums.Resultado;

@Entity
public class Piloto {
	@Id
	private String nombre;
	private Double cantidadCarrerasGanadas = new Double("0");
	private Double cantidadCarrerasCorridas = new Double("0");
	private Double tiempoPromedioBox = new Double("0");
	private Double clasificadoEntrePrimerosDiez = new Double("0");
	private Double cantidadAbandonos = new Double("0");
	private Double promedioPosicionFinalUltimas3 = new Double("0");
	
	@Transient
	private List<ResultadosCarrera> resultadosCarrera = new ArrayList<ResultadosCarrera>();
	@Transient
	private PromedioGanador promedioGanador;
	@Transient
	private PromedioBox promedioBox;
	@Transient
	private Clasificador clasificador;
	@Transient
	private PromedioAbandonos promedioAbandonos;
	@Transient
	private CapacidadGanadora capacidadGanadora;
	@Transient
	private Boolean consistente;
	@Transient
	private EstadoAnimico estadoAnimico;
	@Transient
	private Resultado resultado;
	
	

	public Piloto(String nombre, Double cantidadCarrerasGanadas, Double cantidadCarrerasCorridas, Double tiempoPromedioBox, Double clasificadoEntrePrimerosDiez, Double cantidadAbandonos, Double promedioPosicionFinalUltimas3,
			Double valorPromedioGanadasCorridas) {
		super();
		this.nombre = nombre;
		this.cantidadCarrerasGanadas = cantidadCarrerasGanadas;
		this.cantidadCarrerasCorridas = cantidadCarrerasCorridas;
		this.tiempoPromedioBox = tiempoPromedioBox;
		this.clasificadoEntrePrimerosDiez = clasificadoEntrePrimerosDiez;
		this.cantidadAbandonos = cantidadAbandonos;
		this.promedioPosicionFinalUltimas3 = promedioPosicionFinalUltimas3;
	}
	
	public Piloto(){
		
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public Double getCantidadCarrerasGanadas() {
		return cantidadCarrerasGanadas;
	}

	public void setCantidadCarrerasGanadas(Double cantidadCarrerasGanadas) {
		this.cantidadCarrerasGanadas = cantidadCarrerasGanadas;
	}

	public Double getCantidadCarrerasCorridas() {
		return cantidadCarrerasCorridas;
	}

	public void setCantidadCarrerasCorridas(Double cantidadCarrerasCorridas) {
		this.cantidadCarrerasCorridas = cantidadCarrerasCorridas;
	}

	
	public Double getTiempoPromedioBox() {
		return tiempoPromedioBox;
	}

	public void setTiempoPromedioBox(Double tiempoPromedioBox) {
		this.tiempoPromedioBox = tiempoPromedioBox;
	}

	public Double getClasificadoEntrePrimerosDiez() {
		return clasificadoEntrePrimerosDiez;
	}

	public void setClasificadoEntrePrimerosDiez(Double clasificadoEntrePrimerosDiez) {
		this.clasificadoEntrePrimerosDiez = clasificadoEntrePrimerosDiez;
	}

	public Double getCantidadAbandonos() {
		return cantidadAbandonos;
	}

	public void setCantidadAbandonos(Double cantidadAbandonos) {
		this.cantidadAbandonos = cantidadAbandonos;
	}

	public Double getPromedioPosicionFinalUltimas3() {
		return promedioPosicionFinalUltimas3;
	}

	public void setPromedioPosicionFinalUltimas3(Double promedioPosicionFinalUltimas3) {
		this.promedioPosicionFinalUltimas3 = promedioPosicionFinalUltimas3;
	}


	public PromedioGanador getPromedioGanador() {
		return promedioGanador;
	}

	public void setPromedioGanador(PromedioGanador promedioGanador) {
		this.promedioGanador = promedioGanador;
	}

	public PromedioBox getPromedioBox() {
		return promedioBox;
	}

	public void setPromedioBox(PromedioBox promedioBox) {
		this.promedioBox = promedioBox;
	}

	public Clasificador getClasificador() {
		return clasificador;
	}

	public void setClasificador(Clasificador clasificador) {
		this.clasificador = clasificador;
	}

	public PromedioAbandonos getPromedioAbandonos() {
		return promedioAbandonos;
	}

	public void setPromedioAbandonos(PromedioAbandonos promedioAbandonos) {
		this.promedioAbandonos = promedioAbandonos;
	}

	public CapacidadGanadora getCapacidadGanadora() {
		return capacidadGanadora;
	}

	public void setCapacidadGanadora(CapacidadGanadora capacidadGanadora) {
		this.capacidadGanadora = capacidadGanadora;
	}

	public Boolean getConsistente() {
		return consistente;
	}

	public void setConsistente(Boolean consistente) {
		this.consistente = consistente;
	}

	public EstadoAnimico getEstadoAnimico() {
		return estadoAnimico;
	}

	public void setEstadoAnimico(EstadoAnimico estadoAnimico) {
		this.estadoAnimico = estadoAnimico;
	}

	public Resultado getResultado() {
		return resultado;
	}

	public void setResultado(Resultado resultado) {
		this.resultado = resultado;
	}

	public List<ResultadosCarrera> getResultadosCarrera() {
		return resultadosCarrera;
	}

	public void setResultadosCarrera(List<ResultadosCarrera> resultadosCarrera) {
		this.resultadosCarrera = resultadosCarrera;
	}

	@Override
	public String toString() {
		return this.nombre + "\nCantidad Carreras: " + this.cantidadCarrerasCorridas + "\nCantidad Carreras Ganadas: " + this.cantidadCarrerasGanadas + "\nTiempo Promedio Box: " + this.tiempoPromedioBox + "\nPrimeros Diez: " + this.clasificadoEntrePrimerosDiez + "\nAbandonos: " + this.cantidadAbandonos + "\nUltimas 3: " + this.promedioPosicionFinalUltimas3 + "\nRESULTADO FINAL : " + this.resultado + "\n";
	}

	public void calcularUltimasTresCarreras(){
		Collections.sort(resultadosCarrera, new Comparator<ResultadosCarrera>() {
			@Override
			public int compare(final ResultadosCarrera o1, final ResultadosCarrera o2) {
				 final Double id1 = o1.getNroCarrera();
				 final Double id2 = o2.getNroCarrera();
	                return id2.compareTo(id1);
			}
        });
		Double ult3 = new Double("0");
		int iteraciones = 0;
		for (ResultadosCarrera resultado : this.resultadosCarrera) {
			if(resultado.getCarrera()!=null){
				ult3 += resultado.getCarrera();
				iteraciones++;
			}
			if(iteraciones==3)
				break;
		}
		this.promedioPosicionFinalUltimas3 = Math.floor(ult3/iteraciones);
	}
	
	public void calcularClasificadorPrimerosDiez(){
		Double cantidad10 = new Double("0");
		for (ResultadosCarrera resultado : this.resultadosCarrera) {
			if(resultado.getParrilla()!=null && resultado.getParrilla() <= 10){
				cantidad10++;
			}
		}
		this.clasificadoEntrePrimerosDiez = cantidad10;
	}
	
	public Double calcularApuesta(){
		if(this.resultado!=null){
			if(this.resultado.equals(Resultado.CATEGORIA1))
				return new Double("1.75");
			if(this.resultado.equals(Resultado.CATEGORIA2))
				return new Double("15");
			if(this.resultado.equals(Resultado.CATEGORIA3))
				return new Double("25");
			if(this.resultado.equals(Resultado.CATEGORIA4))
				return new Double("175");
			if(this.resultado.equals(Resultado.CATEGORIA5))
				return new Double("375");
			if(this.resultado.equals(Resultado.CATEGORIA6))
				return new Double("525");
			if(this.resultado.equals(Resultado.CATEGORIA7))
				return new Double("800");
			if(this.resultado.equals(Resultado.CATEGORIA8))
				return new Double("1200");
			if(this.resultado.equals(Resultado.CATEGORIA9))
				return new Double("1500");
			if(this.resultado.equals(Resultado.CATEGORIA10))
				return new Double("6000");
		}
		return new Double("0");
	}
	
}
